#include<bits/stdc++.h>
using namespace std ;
typedef pair<int , int> PII ;

const int MAXN = 1e5 + 10 ;
const int MAXL = 1e6 + 10 ;

struct CAR
{
    int d , v , a ;
}cr[MAXN] ;

int t , n , m , L , V , ans , tnt ;
int det[MAXN] , lrod[MAXL] , rrod[MAXL] ;
PII qj[MAXN] ;

void fd(int l , int r)
{
//    cout << l << ' ' << r << endl ;
    for(int i = 1 ; i <= tnt ; ++ i)
    {
        if(qj[i].first <= r && qj[i].second >= l)
        {
            if(qj[i].first < l)
                qj[i].first = l ;
            if(qj[i].second > r)
                qj[i].second = r ;
            return ;
        }
    }
    qj[++ tnt] = make_pair(l , r) ;
}

int main()
 {
    freopen("detect.in" , "r" , stdin) ;
    freopen("detect.out" , "w" , stdout) ;
    cin >> t ;
    while(t --)
    {
        cin >> n >> m >> L >> V ;
        for(int i = 1 ; i <= n ; ++ i)
            cin >> cr[i].d >> cr[i].v >> cr[i].a ;
        for(int i = 1 ; i <= m ; ++ i)
        {
            cin >> det[i] ;
            lrod[det[i]] = rrod[det[i]] = i ;
            for(int j = det[i - 1] + 1 ; j < det[i] ; ++ j)
            {
                lrod[j] = i - 1 ;
                rrod[j] = i ;
            }
        }
        for(int i = det[m] + 1 ; i <= L ; ++ i)
            lrod[i] = m ;
        for(int i = 1 ; i <= n ; ++ i)
        {
            // for(int j = 1 ; j <= tnt ; ++ j)
            //     cout << qj[j].first << ' ' << qj[j].second << endl ;
            // cout << endl ;
            if(cr[i].a == 0)
            {
                if(cr[i].v > V && rrod[cr[i].d] > 0)
                {
                    fd(rrod[cr[i].d] , m) ;
                    ++ ans ;
                }
            }
            else if(cr[i].a < 0)
            {
                if(cr[i].v <= V) continue ;
                int a1 = cr[i].v * cr[i].v - V * V , a2 = -(2 * cr[i].a) ;
                int wz = min(a1 / a2 + cr[i].d , L);
                if(wz < 0) continue ;
 //               cout << i << ' ' << wz << endl ;
                if(rrod[cr[i].d] > 0 && lrod[wz] > 0 && rrod[cr[i].d] <= lrod[wz])
                {
                    ++ ans ;
                    fd(rrod[cr[i].d] , lrod[wz]) ;
                }
            }
            else
            {
                int a1 = V * V - cr[i].v * cr[i].v , a2 = 2 * cr[i].a ;
                int wz ;
                if(cr[i].v > V) wz = cr[i].d ;
                else wz = a1 / a2 + cr[i].d + 1 ;
                if(wz > L) continue ;
 //               cout << i << ' ' << wz << endl ;
                if(rrod[wz] > 0)
                {
                    ++ ans ;
                    fd(rrod[wz] , m) ;
                }
            }
        }
        cout << ans << ' ' << m - tnt << "\n" ;
        ans = 0 ;
        tnt = 0 ;
        memset(rrod , 0 , sizeof(rrod)) ;
        memset(lrod , 0 , sizeof(lrod)) ;
    }
    return 0 ;
}